﻿/*******************************************************************************
 * @file Yporting.h
 * @brief libymodem 移植相关
 *******************************************************************************
*/

#ifndef __TPORTING_H__
#define __TPORTING_H__

#include <stdint.h>
#include "flash.h"
#include "ring_buffer.h"

extern ring_buffer rx_buf;

#define FLASH_SIZE (FLASH_CAPACITY << 10) // FLASH大小
#define PAGE_SIZE  (FLASH_PAGE_SIZE)      // 页大小
#define YBUF_SIZE  (0x400)                // ymodem接收缓冲区大小

/**
  * @brief  获取一个键值（串口上传键值）
  * @param  key: 存放键值
  * @retval 1: 获取到了
  *         0: 错误，没有键值
  */
static inline uint32_t SerialKeyPressed(uint8_t *key)
{
  return !ring_buffer_read(&rx_buf, key);
}

static inline void Send_Byte(uint8_t byte)
{
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
	USART_SendData(USART1,(uint8_t)byte);
}

typedef enum
{
  YFLASH_BUSY = 1,
  YFLASH_ERROR_PG,
  YFLASH_ERROR_WRP,
  YFLASH_COMPLETE,
  YFLASH_TIMEOUT
}YFlashStatus;

/**
 * @brief 为libymodem提供flash擦除接口，以页为单位擦除
 * @param Page_Address 擦除的地址
 * @return flahs擦除结果
 */
static inline YFlashStatus YEraseFlash(uint32_t Page_Address)
{
  return (YFlashStatus)FLASH_ErasePage(Page_Address);
}

/**
 * @brief 为libymodem提供flash编程接口，以字为单位
 * @param Address 写flasjh的起始地址，2字节对齐
 * @param Data 写入flash的数据
 * @return flash操作结果
 */
static inline YFlashStatus YWriteFlash(uint32_t Address, uint32_t Data)
{
  return (YFlashStatus)FLASH_ProgramWord(Address,Data);
}


#endif // TPORTING_H

